package com.zmn.oms.business.interfaces.log;

import com.zmn.oms.model.dto.log.OperatorAchievementsDto;
import com.zmn.oms.model.dto.log.OrderLogQuery;
import com.zmn.oms.model.entity.log.OrderLog;

import java.util.Date;
import java.util.List;

/**
 * 类描述：工单Log
 *
 * @author lujia
 * @date 2018/12/27 20:17
 */
public interface OrderLogBService {
    /**
     * 根据工单Id 和 log 类型查询
     *
     * @param workId 工单Id
     * @param types  日志类型
     * @return 日志list
     */
    List<OrderLog> findOrderLogsByTypes(Long workId, List<Integer> types);

    /**
     * 根据工单Id 和 log 类型正序查询
     *
     * @param orderId 工单Id
     * @param types   日志类型
     * @return 日志list
     */
    List<OrderLog> findOrderLogsAscByTypes(Long orderId, List<Integer> types);

    /**
     * 根据工单Id 和 操作人 查询
     *
     * @param orderId    工单Id
     * @param operatorId 操作人员Id
     * @return 日志list
     */
    List<OrderLog> findOrderLogsByOperator(Long orderId, Long operatorId);

    /**
     * 根据工单Id 和 工程师Id查询
     *
     * @param orderId  工单Id
     * @param masterId 工程师Id
     * @return 日志list
     */
    List<OrderLog> findOrderLogsByMaster(Long orderId, Long masterId);

    /**
     * 根据订单id 查询log
     *
     * @param orderId
     * @return 日志list
     */
    List<OrderLog> findOrderLogsByOrderId(Long orderId);

    /**
     * 根据订单id 查询log
     *
     * @param orderLogQuery
     * @return 日志list
     */
    List<OrderLog> findOrderLogsByQuery(OrderLogQuery orderLogQuery);

    /**
     * 根据工单id 查询log
     *
     * @param workId
     * @return 日志list
     */
    List<OrderLog> findOrderLogsByWorkId(Long workId);

    /**
     * 根据id 查询log
     *
     * @param id
     * @return 日志list
     */
    OrderLog findOrderLogById(Long id);

    /**
     * 保存
     *
     * @param orderLog
     */
    void save(OrderLog orderLog);

    /**
     * 统计指定时间内的操作者的指定操作类型的订单数量
     *
     * @param startTime           开始时间（含）
     * @param endTime             结束时间（不含）
     * @param orderLogType        订单操作类型
     * @param currentOperatorOnly 订单绩效是否仅计入给最后一次执行该类型操作的操作员。
     *                            即：将该值设为true时，如果一个订单被多次派单，则该工单仅计入给最后一个执行派单操作的操作员绩效
     * @return
     */
    List<OperatorAchievementsDto> findOperatorAchievements(Date startTime, Date endTime,
                                                           Integer orderLogType, boolean currentOperatorOnly);

    /**
     * 查询新跟单日志
     *
     * @param workId
     * @return
     */
    List<OrderLog> findNewTrackLogsByWorkId(Long workId);


    /**
     * 根据参数生成orderLog对象
     *
     * @param orderId    订单号
     * @param workId     工单号
     * @param type       日志类型
     * @param operator   操作员
     * @param operatorId 操作员Id
     * @param operatorType 操作员类型
     * @param content     日志内容
     *
     * @return
     */
    OrderLog generateOrderLog(Long orderId, Long workId, int type, String operator, Long operatorId, Integer operatorType, String content, Date operateTime);

    /**
     * 查询取消申请日志
     *
     * @param workId
     * @return
     */
    List<OrderLog> findCancelApplyLogsByWorkId(Long workId);
}
